{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2d124d22-de73-436b-86cd-9b162b469be8",
   "metadata": {
    "id": "2d124d22-de73-436b-86cd-9b162b469be8"
   },
   "outputs": [],
   "source": [
    "%pip install langchain_community\n",
    "%pip install langchain_experimental\n",
    "%pip install langchain-openai\n",
    "%pip install langchainhub\n",
    "%pip install chromadb\n",
    "%pip install langchain\n",
    "%pip install python-dotenv\n",
    "%pip install PyPDF2 -q --user\n",
    "%pip install rank_bm25\n",
    "%pip install langchain_core\n",
    "\n",
    "# new agent-related installs\n",
    "%pip install tiktoken\n",
    "%pip install langgraph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f884314f-870c-4bfb-b6c1-a5b4801ec172",
   "metadata": {
    "executionInfo": {
     "elapsed": 7390,
     "status": "ok",
     "timestamp": 1715455737041,
     "user": {
      "displayName": "",
      "userId": ""
     },
     "user_tz": 240
    },
    "id": "f884314f-870c-4bfb-b6c1-a5b4801ec172"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import openai\n",
    "from langchain_openai import ChatOpenAI, OpenAIEmbeddings\n",
    "from langchain import hub\n",
    "from langchain_core.output_parsers import StrOutputParser\n",
    "from langchain_core.runnables import RunnablePassthrough\n",
    "import chromadb\n",
    "from langchain_community.vectorstores import Chroma\n",
    "from langchain_core.runnables import RunnableParallel\n",
    "from dotenv import load_dotenv, find_dotenv\n",
    "from langchain_core.prompts import PromptTemplate\n",
    "from PyPDF2 import PdfReader\n",
    "from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
    "from langchain.docstore.document import Document\n",
    "from langchain_community.retrievers import BM25Retriever\n",
    "from langchain.retrievers import EnsembleRetriever"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "eba3468a-d7c2-4a79-8df2-c335542950f2",
   "metadata": {
    "executionInfo": {
     "elapsed": 5,
     "status": "ok",
     "timestamp": 1715455737042,
     "user": {
      "displayName": "",
      "userId": ""
     },
     "user_tz": 240
    },
    "id": "eba3468a-d7c2-4a79-8df2-c335542950f2"
   },
   "outputs": [],
   "source": [
    "# variables\n",
    "_ = load_dotenv(dotenv_path='env.txt')\n",
    "os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY')\n",
    "openai.api_key = os.environ['OPENAI_API_KEY']\n",
    "llm = ChatOpenAI(model_name=\"gpt-4o\", temperature=0, streaming=True)\n",
    "agent_llm = ChatOpenAI(model_name=\"gpt-4o\", temperature=0, streaming=True)\n",
    "embedding_function = OpenAIEmbeddings()\n",
    "pdf_path = \"google-2023-environmental-report.pdf\"\n",
    "collection_name = \"google_environmental_report\"\n",
    "str_output_parser = StrOutputParser()\n",
    "user_query = \"What are Google's environmental initiatives?\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d3ad428a-3eb6-40ec-a1a5-62565ead1e5b",
   "metadata": {
    "id": "d3ad428a-3eb6-40ec-a1a5-62565ead1e5b"
   },
   "outputs": [],
   "source": [
    "#### INDEXING ####"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "98ccda2c-0f4c-41c5-804d-2227cdf35aa7",
   "metadata": {
    "executionInfo": {
     "elapsed": 19512,
     "status": "ok",
     "timestamp": 1715455756551,
     "user": {
      "displayName": "",
      "userId": ""
     },
     "user_tz": 240
    },
    "id": "98ccda2c-0f4c-41c5-804d-2227cdf35aa7"
   },
   "outputs": [],
   "source": [
    "# Load the PDF and extract text\n",
    "pdf_reader = PdfReader(pdf_path)\n",
    "text = \"\"\n",
    "for page in pdf_reader.pages:\n",
    "    text += page.extract_text()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "927a4c65-aa05-486c-8295-2f99673e7c20",
   "metadata": {
    "executionInfo": {
     "elapsed": 12,
     "status": "ok",
     "timestamp": 1715455756552,
     "user": {
      "displayName": "",
      "userId": ""
     },
     "user_tz": 240
    },
    "id": "927a4c65-aa05-486c-8295-2f99673e7c20"
   },
   "outputs": [],
   "source": [
    "# Split\n",
    "character_splitter = RecursiveCharacterTextSplitter(\n",
    "    separators=[\"\\n\\n\", \"\\n\", \". \", \" \", \"\"],\n",
    "    chunk_size=1000,\n",
    "    chunk_overlap=200\n",
    ")\n",
    "splits = character_splitter.split_text(text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "34e79382-dbb5-4e53-8d21-c4b4375d5084",
   "metadata": {},
   "outputs": [],
   "source": [
    "dense_documents = [Document(page_content=text, metadata={\"id\": str(i), \"source\": \"dense\"}) for i, text in enumerate(splits)]\n",
    "sparse_documents = [Document(page_content=text, metadata={\"id\": str(i), \"source\": \"sparse\"}) for i, text in enumerate(splits)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6b13568c-d633-464d-8c43-0d55f34cc8c1",
   "metadata": {
    "executionInfo": {
     "elapsed": 9471,
     "status": "ok",
     "timestamp": 1715455766015,
     "user": {
      "displayName": "",
      "userId": ""
     },
     "user_tz": 240
    },
    "id": "6b13568c-d633-464d-8c43-0d55f34cc8c1"
   },
   "outputs": [],
   "source": [
    "# Chroma Vector Store\n",
    "chroma_client = chromadb.Client()\n",
    "vectorstore = Chroma.from_documents(\n",
    "    documents=dense_documents,\n",
    "    embedding=embedding_function,\n",
    "    collection_name=collection_name,\n",
    "    client=chroma_client\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6a399c41-0fb0-4a68-a220-88c4ab661e9e",
   "metadata": {},
   "outputs": [],
   "source": [
    "dense_retriever = vectorstore.as_retriever(search_kwargs={\"k\": 10})\n",
    "sparse_retriever = BM25Retriever.from_documents(sparse_documents, k=10)\n",
    "ensemble_retriever = EnsembleRetriever(retrievers=[dense_retriever, sparse_retriever], weights=[0.5, 0.5], c=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dcfdd5e7-8cfb-4eee-a605-1ecaa5828e5c",
   "metadata": {},
   "outputs": [],
   "source": [
    "#### TOOLS ####"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ec1783c5-143b-4850-90eb-4a91769661d5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Tool #1: Web Search"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "013b8878-3a43-43f7-ad8e-dab992aff860",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Tavily Setup\n",
    "# set up your API key at https://tavily.com/\n",
    "# add the API key to your env.txt file\n",
    "from langchain_community.tools.tavily_search import TavilySearchResults\n",
    "\n",
    "_ = load_dotenv(dotenv_path='env.txt')\n",
    "os.environ['TAVILY_API_KEY'] = os.getenv('TAVILY_API_KEY')\n",
    "!export TAVILY_API_KEY=os.environ['TAVILY_API_KEY']\n",
    "web_search = TavilySearchResults(max_results=4)\n",
    "web_search_name = web_search.name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bf02c540-c5bb-4af4-bb3d-3629e0ba0075",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "web_search.invoke(user_query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d88d9ab1-7496-42af-92d7-b12370160c35",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Tool #2: Data Retriever"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cfb43c44-d394-4ad3-ba83-9270aba9ff35",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.tools.retriever import create_retriever_tool\n",
    "\n",
    "retriever_tool = create_retriever_tool(\n",
    "    ensemble_retriever,\n",
    "    \"retrieve_google_environmental_question_answers\",\n",
    "    \"Extensive information about Google environmental efforts from 2023.\",\n",
    ")\n",
    "retriever_tool_name = retriever_tool.name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "d0f102d1-612d-43fa-b310-af07e748d182",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define tools for agent\n",
    "tools = [web_search, retriever_tool]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "b07ad612-b59d-40a1-bbd7-c2fab4aed25b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from typing import Annotated, Literal, Sequence, TypedDict\n",
    "from langchain_core.messages import BaseMessage\n",
    "from langgraph.graph.message import add_messages\n",
    "\n",
    "class AgentState(TypedDict):\n",
    "    messages: Annotated[Sequence[BaseMessage], add_messages]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "1819a56d-b376-4055-be1c-b3fa4441ba1e",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_core.messages import HumanMessage\n",
    "from langchain_core.pydantic_v1 import BaseModel, Field\n",
    "from langgraph.prebuilt import tools_condition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "ac0ef771-7a67-4469-915c-58239c3dd9ac",
   "metadata": {},
   "outputs": [],
   "source": [
    "generation_prompt = PromptTemplate.from_template(\n",
    "    \"\"\"You are an assistant for question-answering tasks. \n",
    "    Use the following pieces of retrieved context to answer \n",
    "    the question. If you don't know the answer, just say \n",
    "    that you don't know. Provide a thorough description to \n",
    "    fully answer the question, utilizing any relevant \n",
    "    information you find.\n",
    "    \n",
    "    Question: {question} \n",
    "    Context: {context} \n",
    "    \n",
    "    Answer:\"\"\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "2cbbd119-fc4f-412b-8935-1616a7d847a6",
   "metadata": {},
   "outputs": [],
   "source": [
    "### Edges - determines whether the retrieved documents are relevant to the question.\n",
    "def score_documents(state) -> Literal[\"generate\", \"improve\"]:\n",
    "\n",
    "    print(\"---CHECK RELEVANCE---\")\n",
    "\n",
    "    # Data model - returns a binary score for the relevance check\n",
    "    class scoring(BaseModel):\n",
    "        binary_score: str = Field(description=\"Relevance score 'yes' or 'no'\")\n",
    "\n",
    "    # LLM with tool and validation\n",
    "    llm_with_tool = llm.with_structured_output(scoring)\n",
    "\n",
    "    # Prompt\n",
    "    prompt = PromptTemplate(\n",
    "        template=\"\"\"\n",
    "        You are assessing relevance of a retrieved document to a user question with a binary grade. \\n \n",
    "        \n",
    "        Here is the retrieved document: \\n\\n {context} \\n\\n\n",
    "        Here is the user question: {question} \\n\n",
    "        \n",
    "        If the document contains keyword(s) or semantic meaning related to the user question, grade it as relevant. \\n\n",
    "        Give a binary score 'yes' or 'no' score to indicate whether the document is relevant to the question.\n",
    "        \"\"\",\n",
    "        input_variables=[\"context\", \"question\"],\n",
    "    )\n",
    "\n",
    "    # Chain\n",
    "    chain = prompt | llm_with_tool\n",
    "\n",
    "    messages = state[\"messages\"]\n",
    "    last_message = messages[-1]\n",
    "    question = messages[0].content\n",
    "    docs = last_message.content\n",
    "\n",
    "    scored_result = chain.invoke({\"question\": question, \"context\": docs})\n",
    "    score = scored_result.binary_score\n",
    "\n",
    "    if score == \"yes\":\n",
    "        print(\"---DECISION: DOCS RELEVANT---\")\n",
    "        return \"generate\"\n",
    "\n",
    "    else:\n",
    "        print(\"---DECISION: DOCS NOT RELEVANT---\")\n",
    "        print(score)\n",
    "        return \"improve\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "dadfd63e-c526-4897-a426-9f248fea3f27",
   "metadata": {},
   "outputs": [],
   "source": [
    "### Nodes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "6f8d2842-590e-441a-bafd-e4f8370c1d89",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Agent node - invokes the agent model to generate a response based on the current state. \n",
    "# Decision choices (given the question): retrieve using the retriever tool, web_search tool, both, or end.\n",
    "def agent(state):\n",
    "    print(\"---CALL AGENT---\")\n",
    "    messages = state[\"messages\"]\n",
    "    llm = agent_llm.bind_tools(tools)\n",
    "    response = llm.invoke(messages)\n",
    "    return {\"messages\": [response]} # Return list, will get added to existing list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "587b5ea9-16d0-4f1e-b0a9-ecf481c8a209",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Improve node - transform the query to produce a better question.\n",
    "def improve(state):\n",
    "    print(\"---TRANSFORM QUERY---\")\n",
    "    messages = state[\"messages\"]\n",
    "    question = messages[0].content\n",
    "\n",
    "    msg = [\n",
    "        HumanMessage(content=f\"\"\"\\n \n",
    "            Look at the input and try to reason about the underlying semantic intent / meaning. \\n \n",
    "            Here is the initial question:\n",
    "            \\n ------- \\n\n",
    "            {question} \n",
    "            \\n ------- \\n\n",
    "            Formulate an improved question: \n",
    "            \"\"\",\n",
    "        )\n",
    "    ]\n",
    "\n",
    "    # Scoring\n",
    "    response = llm.invoke(msg)\n",
    "    return {\"messages\": [response]}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "bdfd3ec6-bc33-464b-a47c-f0054d2688ec",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Generate node - generate answer\n",
    "def generate(state):\n",
    "    print(\"---GENERATE---\")\n",
    "    messages = state[\"messages\"]\n",
    "    question = messages[0].content\n",
    "    last_message = messages[-1]\n",
    "\n",
    "    question = messages[0].content\n",
    "    docs = last_message.content\n",
    "\n",
    "    # Chain\n",
    "    rag_chain = generation_prompt | llm | str_output_parser\n",
    "\n",
    "    # Run\n",
    "    response = rag_chain.invoke({\"context\": docs, \"question\": question})\n",
    "    return {\"messages\": [response]}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "d4b36d98-a2ac-453e-b97e-db6cd2ce474c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Cyclical Graph Setup\n",
    "from langgraph.graph import END, StateGraph\n",
    "from langgraph.prebuilt import ToolNode\n",
    "\n",
    "# Define a new graph\n",
    "workflow = StateGraph(AgentState)\n",
    "\n",
    "# Define the nodes we will cycle between\n",
    "workflow.add_node(\"agent\", agent)  # agent\n",
    "retrieve = ToolNode(tools)\n",
    "workflow.add_node(\"retrieve\", retrieve)  # retrieval from web and or retriever\n",
    "workflow.add_node(\"improve\", improve)  # Improving the question for better retrieval\n",
    "workflow.add_node(\"generate\", generate)  # Generating a response after we know the documents are relevant\n",
    "\n",
    "# Call agent node to decide to retrieve or not\n",
    "workflow.set_entry_point(\"agent\")\n",
    "\n",
    "# Decide whether to retrieve (assess agent decision)\n",
    "workflow.add_conditional_edges(\"agent\", tools_condition, \n",
    "    # Translate the condition outputs to nodes in our graph\n",
    "    {\n",
    "        \"tools\": \"retrieve\",\n",
    "        END: END,\n",
    "    },\n",
    ")\n",
    "\n",
    "# Edges taken after the `action` node is called (assess agent decision)\n",
    "workflow.add_conditional_edges(\"retrieve\", score_documents)\n",
    "workflow.add_edge(\"generate\", END)\n",
    "workflow.add_edge(\"improve\", \"agent\")\n",
    "\n",
    "# Compile\n",
    "graph = workflow.compile()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "44402c63-207d-4669-93ad-062abd9685e4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/jpeg": "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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.display import Image, display\n",
    "\n",
    "try:\n",
    "    display(Image(graph.get_graph(xray=True).draw_mermaid_png()))\n",
    "except:\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "1cca0689-04c2-45e4-abbf-bf29f96647ff",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "---CALL AGENT---\n",
      "\"Output from node 'agent':\"\n",
      "'---'\n",
      "{ 'messages': [ AIMessage(content='', additional_kwargs={'tool_calls': [{'index': 0, 'id': 'call_46NqZuz3gN2F9IR5jq0MRdVm', 'function': {'arguments': '{\"query\":\"Google\\'s environmental initiatives\"}', 'name': 'retrieve_google_environmental_question_answers'}, 'type': 'function'}]}, response_metadata={'finish_reason': 'tool_calls'}, id='run-eba27f1e-1c32-4ffc-a161-55a32d645498-0', tool_calls=[{'name': 'retrieve_google_environmental_question_answers', 'args': {'query': \"Google's environmental initiatives\"}, 'id': 'call_46NqZuz3gN2F9IR5jq0MRdVm'}])]}\n",
      "'\\n---\\n'\n",
      "---CHECK RELEVANCE---\n",
      "---DECISION: DOCS RELEVANT---\n",
      "\"Output from node 'retrieve':\"\n",
      "'---'\n",
      "{ 'messages': [ ToolMessage(content='iMasons Climate AccordGoogle is a founding member and part of the governing body of the iMasons Climate Accord, a coalition united on carbon reduction in digital infrastructure.\\nReFEDIn 2022, to activate industry-wide change, Google provided anchor funding to kickstart the ReFED Catalytic Grant Fund, with the goal of accelerating and scaling food waste solutions.\\nThe Nature Conservancy (TNC)In 2022, Google supported three of the Nature Conservancy’s watershed projects in Chile and the United States, and Google.org supported a three-phased approach to catalyze active reforestation of kelp at impactful scales. Google.org also provided a grant to TNC to develop a machine-learning-powered timber-tracing API to stop deforestation in the Amazon at scale; a team of Google engineers is working full-time for six months with TNC to develop this product as part of the Google.org Fellowship Program.\\n\\nSustainable \\nconsumption of \\npublic goods (e.g., \\n“right to repair”)Google submitted comments to the European Commission’s public consultation regarding \\nthe promotion of repair and reuse of goods. We shared our views on the core principles to \\nconsider when introducing policy measures to promote repair and reuse horizontally, and for \\nsmartphones and tablets specifically.\\nBody of European \\nRegulators \\nfor Electronic \\nCommunications \\n(BEREC)Google responded to a questionnaire  by BEREC in view of the development of key performance \\nindicators to characterize the environmental impact of electronic communications, networks, \\ndevices, and services. We provided information about our environmental reporting practices \\nand suggestions to help identify which indicators would provide relevant environmental \\ninformation.\\nEngagement with coalitions and sustainability initiatives\\nRE-Source PlatformGoogle is a strategic partner and steering committee member of the RE-Source Platform, the\\n\\nThe opportunity we have through our products and \\nplatforms is reflected in our updated environmental sustainability strategy, which focuses on where we can make the most significant positive impact. Our work is organized around three key pillars: empowering individuals to take action, working together with our partners and customers, and operating our business\\xa0sustainably.\\nIn 2022, we reached our goal to help 1 billion people \\nmake more sustainable choices through our products. We achieved this by offering sustainability features like eco-friendly routing in Google Maps, energy efficiency features in Google Nest thermostats, and carbon emissions information in Google Flights. Looking ahead, our aspiration is to help individuals, cities, and other partners collectively reduce 1 gigaton of their carbon equivalent emissions annually by 2030.\\n\\u20092\\n\\nchemistry\\n• Governance and engagement - Risk management; Stakeholder engagement - Supplier \\nengagement\\nEngagement with external targets and initiatives related to sustainable \\nsupply chains • Wor king together - Our approach - Supporting partners - Cloud customers and  \\ncommercial partners\\n• Governance and engagement - PartnershipsC12. Engagement\\nGoals and targets Supplier environmental assessment-related targets• Introd uction - Targets and progress summary\\n• Oper ating sustainably - Circular economy - Our approach - Working with suppliers\\nPerformance indicators New suppliers that were screened using environmental criteria • Governance and engagement - Risk management C12. Engagement\\nSupplier renewable energy• Opera ting sustainably - Net-zero carbon - Our approach - Advancing carbon-free energy - \\nCFE inv estmentsC2. Risks and opportunities\\nNegative environmental impacts in the supply chain and actions taken• Oper ating sustainably - Circular economy - Supply chain\\n\\nthe United States for pre-owned products, such as used and refurbished products. The journey \\nahead\\nWhile a single individual’s actions may seem small, when \\nbillions of people have the tools to make more sustainable decisions, they add up to have a meaningful impact on their communities and the entire planet. \\nWe’re excited by the opportunity to enable climate and \\nenvironmental action far beyond Google’s direct impact, through information and innovation.\\nLEARN MORE\\n • Empowering with technology\\n • Google Maps eco-friendly routing\\n • Searching for sustainability with Google\\n • Supporting a clean energy future with Nest Renew\\n • The search for sustainability   20\\n2023 Environmental Report  Working \\ntogether\\nWe’re working together with our \\npartners and customers to advance technology for sustainabilityOur ambition\\nOur approach\\nSupporting partners\\nInvesting in breakthrough \\ninnovation\\nCreating ecosystems for \\ncollaboration\\nThe journey ahead\\n   21\\n2023 Environmental Report  Our ambition\\n\\nSuppli er engagementC12. Engagement\\nBoard and/or management oversight • Gove rnance and engagement C12. Engagement\\nManagement approachApproach to supply chain risk environmental assessments and audits • Gove rnance and engagement - Stakeholder engagement - Supplier engagement\\nIntegration of environmental factors within procurement policies  \\nand supplier contracts• Operating sustainably - Net-zero carbon - Our approach - Reducing carbon emissions -  \\nSupplier engagement\\n• Governance and engagement - Risk managementC12. Engagement\\nApproach to supplier capacity building, training, and corrective  \\naction plans• Operating sustainably - Net-zero carbon - Our approach - Reducing carbon emissions - \\nSupplier engagement; Circular economy - Our approach - Working with suppliers - Safer \\nchemistry\\n• Governance and engagement - Risk management; Stakeholder engagement - Supplier \\nengagement\\nEngagement with external targets and initiatives related to sustainable\\n\\nEmpowering individuals:  \\nA parking lot full of electric vehicles lined up outside a Google office, \\nplugged into charging stations.\\nWorking together:  \\nSatellite-derived Earth Engine image showing seasonal agricultural peaks \\nnear the Columbia and Snake Rivers in Washington state. The perfectly round fields are center pivot irrigated corn and wheat maturing in different months. Data source: Landsat 8, U.S. Geological Survey.\\nOperating sustainably:  \\nA view of our Bay View campus with the events center in the foreground \\nand a Google brandmark sculpture. (Photo: Iwan Baan)\\nNet-zero carbon:  \\nGolden Hills wind farm in California (43 MW for Google)\\nWater stewardship:  \\nOur Bay View campus, as seen from across its stormwater retention pond. (Photo: Iwan Baan)\\nCircular economy:  \\nA closeup of many small, broken circuit boards in a pile. Our approach\\n\\nC3. Business strategy Strategy: C\\nIntegration of climate-related risks and scenario analysis  \\ninto overall risk management and resiliency planning • Governance and engagement - Risk management - Climate-related risks C2. Risks and opportunities Risk management: C\\nIntegration of environmental risks in data center planning• Operating sustainably - Net-zero carbon - Our approach - Reducing carbon emissions -  \\nEnergy-efficient and low-carbon facilities - Data centersC2. Risks and opportunities Risk management: BTC-IM-130a.3\\nTC-SI-130a.3\\nValue chain engagement on climate change • Operating sustainably - Net-zero carbon - Reducing carbon emissions - Supplier engagement; \\nAdvancing carbon-free energy - CFE investmentsC12. Engagement\\nEngagement with external targets and initiatives related to net zero • Operating sustainably - Net-zero carbon - Advancing carbon-free energy -  \\nTransforming the energy system through partnerships and advocacy\\n\\nIn 2022, we audited a subset of our suppliers to verify \\ncompliance for the following environmental criteria: implementation of environmental management systems, environmental permits and reporting, product content restrictions, and resource efficiency, as well as management of hazardous substances, wastewater,  solid waste, and air emissions.\\nGooglers chat among indoor plants at our Pier 57 office in New York City.   79\\n2023 Environmental Report  Public policy and advocacy\\nWe know that strong public policy action is critical to \\ncreating prosperous, equitable, and resilient low-carbon economies around the world. \\nThe United Nations Framework Convention on Climate \\nChange (UNFCCC)’s 2015 Paris Agreement states that humanity must “keep global temperature rise this century well below 2°C above pre-industrial levels.”\\n\\u2009143 Google\\n\\nuse; Benefiting watersheds and communities - Our water replenishment projectsC3. Business strategyTC-IM-130a.2\\nTC-SI-130a.2\\nIntegration of environmental considerations into data center strategic planning• Opera ting sustainably - Water stewardship - Our approach - Advancing responsible water \\nuse - Data centersC3. Business strategyTC-IM-130a.3\\nTC-SI-130a.3\\nInteractions with water as a shared resource• Oper ating sustainably - Water stewardship - Our approach - Benefiting watersheds and \\ncomm unities\\nValue chain engagement on water-related issues• Oper ating sustainably - Water stewardship - Our approach - Advancing responsible water \\nuse - S upply chainC12. Engagement\\nEngagement with external targets and initiatives related to water stewardship• Operating  sustainably - Water stewardship - Our approach - Benefiting watersheds  \\nand communities; Supporting water security with technology\\n• Working together - Our approach - Supporting partners - Adaptation support  \\nfor communities\\n\\nWorld Business Council for Sustainable Development (WBCSD)Google has been a member of the WBCSD for several years and participates in a number of its initiatives. \\nWe’re a\\nctively involved in initiatives related to improving well-being for people and the planet, including  \\nshifting diets, consumer behavior changes, and regenerative agriculture. \\nWorld Resources Institute (WRI)Google has a 13-year long relationship with WRI for impact-focused collaboration. Some key projects include developing a near-real-time land cover dataset ( Dynamic World ), deforestation monitoring and alerts ( Global \\nForest Watch ), ending commodity-driven deforestation and accelerating restoration ( Forest Data Partnership ), \\nmeasuring and mitigating extreme heat ( supported by Google.org ), and educating stakeholders on 24/7 CFE.   84\\n2023 Environmental Report  Awards and recognition\\n2022 CDP Climate Change A List  \\nAlphabet has been named to CDP’s Climate Change A list,\\n\\nThrough our Product Restricted Substances Specification  \\nand Manufacturer Restricted Substances List, we restrict \\nmany hazardous substances and ensure our suppliers have processes in place to detect and prevent them from entering the manufacturing process. We’ve laid  a solid foundation  as we pursue our next level goals in \\nsafer chemistry.\\nIn 2022, we shared more details about our comprehensive \\nResponsible Chemical Management program  that \\nincludes assessments, guidance, and training resources to help suppliers better mitigate occupational and environmental risks related to the chemicals they use. Recent initiatives have included in-depth assessment programs with greater levels of detail and transparency, extensive supplier training and guidance materials to more proactively manage risk, and new industry partnerships that al\\nlow us to share best practices intended to  \\nadvance the industry at large.\\nWe continue to enroll suppliers into e-learning courses,\\n\\nProtection Agency (EPA), including 3 Google hosted events with EPA Administrator Michael \\nRegan on environmental justice, how Google products promote recycling within the circular \\neconomy, and using AI to identify lead pipes. At the U.S. Department of Energy, Nest continued \\ndialog with both the Loans Program Office about designation as an innovative product, and \\nOffice of the Under Secretary for Science and Innovation. We also met with the White House  \\non multiple projects, and received invitations to summits for our work on lead pipe reduction \\nand home electrification.U.S. SEC comments \\non proposed rule on \\nEnhancement and \\nStandardization of \\nClimate-Related \\nDisclosures for \\nInvestorsIn partnership with nine other peer technology companies, Google provided comments  to \\nthe Securities and Exchange Commission’s (SEC) proposed rule on enhanced climate-related \\ndisclosures. The comments state our support for regular and consistent reporting of climate-\\n\\n95 That’s why we’re supporting the development \\nand commercialization of emerging carbon removal technologies, as well as the development of initiatives to ensure the integrity and climate impact of CDR solutions. \\nStarting in 2022, we began funding the development of \\nnature-based and technology-based carbon removal solutions. At the World Economic Forum Annual Meeting in 2022, Google joined the First Movers Coalition . As a \\nchampion for the Carbon Dioxide Removal sector, Google committed to contract for durable and scalable net carbon dioxide removal to be achieved by the end of 2030.\\nIn 2022, we contributed $200 million towards a $925 million \\ntotal pledge to Frontier , an advanced market commitment\\n\\n2\\nAfter two years of condensed reporting, we’re sharing a deeper dive into our approach in one place in our 2023 Environmental Report. In 2022, we continued to make measurable progress in many key ways, such as:\\n• We enhanced and launched new sustainabilityproduct features , such as eco-friendly routing in\\nMaps, which is estimated to have helped preventmore than 1.2 million metric tons of carbon emissionsfrom launch through 2022—equivalent to takingapproximately 250,000 fuel-based cars off the roadfor a year.\\n\\u20093\\n• We expanded the availability of Google EarthEngine —which provides access to reliable, up-to-\\ndate insights on how our planet is changing—toinclude businesses and governments worldwide as anenterprise-grade service through Google Cloud.• We opened our new Bay View campus , which is\\nall-electric, net water-positive, restores over 17 acresof high-value nature, and incorporates the leadingprinciples of circular design.\\n\\n• Working together - Our approach - Supporting partners - Governments and \\nintergovernmental organizations - Environmental Insights Explorer; Adaptation support for \\ncommunities; Investing in breakthr ough innovation - Ocean ecosystemsC2. Risks and opportunities\\nC3. Business strategy\\nApproach to managing progress against internal and external  \\nnature-related targets and expectations• Oper ating sustainably - Nature and biodiversity - Our approach\\nEngagement with external targets and initiatives related to nature  \\nand biodiversity• Work ing together - Our approach - Supporting partners - Governments and \\nintergovernmental organizations; Researchers, academics, and NGOs\\n• Gove rnance and engagement - PartnershipsC15. Biodiversity\\nGoals and targets Nature- and biodiversity-related targets and progress against goals • Intro duction - Targets and progress summary C15. Biodiversity\\n\\nSince Google was founded, our efforts to mitigate climate \\nchange have started with our own operations, and we’ve worked hard to lead by example with the ultimate goal of driving larger systemic change. In our third decade of climate action, we’ll continue to take a science-based approach to our efforts, while sharing our own lessons and progress with others. \\nI joined Google eight years ago to lead our sustainability \\nefforts, and have witnessed our sense of urgency and ambition firsthand. We’re empowering individuals, governments, businesses, and other organizations to make decisions that can drive positive action for people and our planet.\\nThe opportunity we have through our products and\\n\\n2023 Environmental Report  Risk management\\nOur Enterprise Risk Management (ERM) team is responsible \\nfor identifying, assessing, and reporting risks related to the company’s operations, financial performance, and reputation. As with financial, operational, and strategic risks, the team assesses environmental risks as part of the company’s overall risk management framework. The risks and opportunities identified through this process support public disclosures and inform Google’s environmental sustainability strategy. Our Chief Sustainability Officer and sustainability teams work to address risks by identifying opportunities to reduce the company’s environmental impacts from its operations and value chain, and through improving climate resilience. \\nClimate-related \\nrisks\\nClimate-related risks and opportunities have long time\\n\\nof over 140 partner organizations.\\nThe Google.org Impact Challenge on Climate Innovation supports breakthrough projects that use data and technology to \\naccelerate climate action.\\nThe journey ahead\\nFrom measuring and monitoring changes on the Earth’s surface, improving forecast and prediction models for flooding and wildfires, optimizing operations, combining disparate data sources, and designing more efficient products, we continue to leverage our expertise in technology and apply the latest advancements to help solve global challenges.\\nWe believe that by working together with our partners and \\ncustomers, we can make a real difference in addressing the challenges of climate change and ecosystem degradation. LEARN MORE\\n• Data Commons\\n• Environmental Insights Explorer\\n• Google Cloud sustainability\\n• Google Earth Engine\\n• Sustainability-focused accelerators   31\\n2023 Environmental Report  Operating \\nsustainably\\nWe’re showing the way forward \\nthrough our own operationsOur ambition\\n\\nemphasize the importance of reforms that allow independent power producers to continue \\nto thrive and deploy new clean energy resources to meet customer demand. In particular, we \\nadvocate for greater transparency in non-RTO (Regional Transmission Organization) regions \\nand penalties for delays to interconnection studies.\\nU.S. Department of \\nEnergy comments \\non Clean Hydrogen \\nProduction StandardGoogle filed comments  on the Clean Hydrogen Production Standard draft guidance. In \\nparticular, we highlighted the need for strong quality criteria—hourly temporal correlation, \\ngeographic correlation, and additionality—to ensure that grid-based clean hydrogen is \\nproduced using clean electricity. \\nEngagement with coalitions and sustainability initiatives\\nSupporting the U.S. \\nState Department’s \\nClean Energy Demand \\nInitiative (CEDI)Google.org provided a philanthropic grant to support the establishment of the Secretariat of', name='retrieve_google_environmental_question_answers', id='53329b8d-28eb-403d-8fcd-2abbffdb8425', tool_call_id='call_46NqZuz3gN2F9IR5jq0MRdVm')]}\n",
      "'\\n---\\n'\n",
      "---GENERATE---\n",
      "\"Output from node 'generate':\"\n",
      "'---'\n",
      "{ 'messages': [ 'Google has a comprehensive and multifaceted approach to '\n",
      "                'environmental sustainability, encompassing various '\n",
      "                'initiatives aimed at reducing carbon emissions, promoting '\n",
      "                'sustainable practices, and leveraging technology for '\n",
      "                \"environmental benefits. Here are some key aspects of Google's \"\n",
      "                'environmental initiatives:\\n'\n",
      "                '\\n'\n",
      "                '1. **Carbon Reduction and Renewable Energy**:\\n'\n",
      "                '   - **iMasons Climate Accord**: Google is a founding member '\n",
      "                'and part of the governing body of this coalition focused on '\n",
      "                'reducing carbon emissions in digital infrastructure.\\n'\n",
      "                '   - **Net-Zero Carbon**: Google is committed to operating '\n",
      "                'sustainably with a focus on achieving net-zero carbon '\n",
      "                'emissions. This includes investments in carbon-free energy '\n",
      "                'and energy-efficient facilities, such as their all-electric, '\n",
      "                'net water-positive Bay View campus.\\n'\n",
      "                '\\n'\n",
      "                '2. **Sustainable Consumption and Circular Economy**:\\n'\n",
      "                '   - **Right to Repair**: Google has engaged with the '\n",
      "                'European Commission to promote the repair and reuse of goods, '\n",
      "                'particularly smartphones and tablets.\\n'\n",
      "                '   - **Circular Economy**: Google works with suppliers to '\n",
      "                'ensure environmental criteria are met, including the '\n",
      "                'management of hazardous substances and resource efficiency. '\n",
      "                'They also promote recycling and the use of refurbished '\n",
      "                'products.\\n'\n",
      "                '\\n'\n",
      "                '3. **Water Stewardship**:\\n'\n",
      "                '   - Google supports watershed projects and responsible water '\n",
      "                'use, including initiatives in Chile and the United States. '\n",
      "                'Their Bay View campus incorporates stormwater retention and '\n",
      "                'other water-positive features.\\n'\n",
      "                '\\n'\n",
      "                '4. **Food Waste Reduction**:\\n'\n",
      "                '   - **ReFED**: Google provided anchor funding to the ReFED '\n",
      "                'Catalytic Grant Fund to accelerate and scale food waste '\n",
      "                'solutions.\\n'\n",
      "                '\\n'\n",
      "                '5. **Reforestation and Biodiversity**:\\n'\n",
      "                '   - **The Nature Conservancy (TNC)**: Google supports '\n",
      "                'reforestation projects and the development of technology to '\n",
      "                'stop deforestation in the Amazon. They also work on kelp '\n",
      "                'reforestation and other biodiversity initiatives.\\n'\n",
      "                '\\n'\n",
      "                '6. **Technology and Data for Environmental Action**:\\n'\n",
      "                '   - **Google Earth Engine**: Provides access to data for '\n",
      "                'monitoring environmental changes.\\n'\n",
      "                '   - **Environmental Insights Explorer**: Helps cities and '\n",
      "                'organizations measure and reduce their carbon footprint.\\n'\n",
      "                '   - **Google Maps Eco-Friendly Routing**: Offers routes that '\n",
      "                'reduce carbon emissions, helping users make more sustainable '\n",
      "                'travel choices.\\n'\n",
      "                '\\n'\n",
      "                '7. **Public Policy and Advocacy**:\\n'\n",
      "                '   - Google engages in public policy advocacy to support '\n",
      "                'clean energy and climate action, including comments on the '\n",
      "                \"U.S. Department of Energy's Clean Hydrogen Production \"\n",
      "                'Standard and participation in the First Movers Coalition for '\n",
      "                'carbon dioxide removal.\\n'\n",
      "                '\\n'\n",
      "                '8. **Partnerships and Coalitions**:\\n'\n",
      "                '   - Google collaborates with various organizations, '\n",
      "                'including the World Business Council for Sustainable '\n",
      "                'Development (WBCSD) and the World Resources Institute (WRI), '\n",
      "                'to promote sustainability and address climate change.\\n'\n",
      "                '\\n'\n",
      "                '9. **Empowering Individuals and Communities**:\\n'\n",
      "                '   - Google aims to help 1 billion people make more '\n",
      "                'sustainable choices through their products by 2030. This '\n",
      "                'includes features like energy-efficient Google Nest '\n",
      "                'thermostats and carbon emissions information in Google '\n",
      "                'Flights.\\n'\n",
      "                '\\n'\n",
      "                \"Overall, Google's environmental initiatives are extensive and \"\n",
      "                'integrated into their business operations, product '\n",
      "                'development, and community engagement, reflecting their '\n",
      "                'commitment to sustainability and climate action.']}\n",
      "'\\n---\\n'\n"
     ]
    }
   ],
   "source": [
    "import pprint\n",
    "\n",
    "inputs = {\n",
    "    \"messages\": [\n",
    "        (\"user\", user_query),\n",
    "    ]\n",
    "}\n",
    "final_answer = ''\n",
    "for output in graph.stream(inputs):\n",
    "    for key, value in output.items():\n",
    "        pprint.pprint(f\"Output from node '{key}':\")\n",
    "        pprint.pprint(\"---\")\n",
    "        pprint.pprint(value, indent=2, width=80, depth=None)\n",
    "        final_answer = value\n",
    "    pprint.pprint(\"\\n---\\n\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "6c9ebf7a-ccd5-4946-8daf-985f8cd6736f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"Google has a comprehensive and multifaceted approach to environmental sustainability, encompassing various initiatives aimed at reducing carbon emissions, promoting sustainable practices, and leveraging technology for environmental benefits. Here are some key aspects of Google's environmental initiatives:\\n\\n1. **Carbon Reduction and Renewable Energy**:\\n   - **iMasons Climate Accord**: Google is a founding member and part of the governing body of this coalition focused on reducing carbon emissions in digital infrastructure.\\n   - **Net-Zero Carbon**: Google is committed to operating sustainably with a focus on achieving net-zero carbon emissions. This includes investments in carbon-free energy and energy-efficient facilities, such as their all-electric, net water-positive Bay View campus.\\n\\n2. **Sustainable Consumption and Circular Economy**:\\n   - **Right to Repair**: Google has engaged with the European Commission to promote the repair and reuse of goods, particularly smartphones and tablets.\\n   - **Circular Economy**: Google works with suppliers to ensure environmental criteria are met, including the management of hazardous substances and resource efficiency. They also promote recycling and the use of refurbished products.\\n\\n3. **Water Stewardship**:\\n   - Google supports watershed projects and responsible water use, including initiatives in Chile and the United States. Their Bay View campus incorporates stormwater retention and other water-positive features.\\n\\n4. **Food Waste Reduction**:\\n   - **ReFED**: Google provided anchor funding to the ReFED Catalytic Grant Fund to accelerate and scale food waste solutions.\\n\\n5. **Reforestation and Biodiversity**:\\n   - **The Nature Conservancy (TNC)**: Google supports reforestation projects and the development of technology to stop deforestation in the Amazon. They also work on kelp reforestation and other biodiversity initiatives.\\n\\n6. **Technology and Data for Environmental Action**:\\n   - **Google Earth Engine**: Provides access to data for monitoring environmental changes.\\n   - **Environmental Insights Explorer**: Helps cities and organizations measure and reduce their carbon footprint.\\n   - **Google Maps Eco-Friendly Routing**: Offers routes that reduce carbon emissions, helping users make more sustainable travel choices.\\n\\n7. **Public Policy and Advocacy**:\\n   - Google engages in public policy advocacy to support clean energy and climate action, including comments on the U.S. Department of Energy's Clean Hydrogen Production Standard and participation in the First Movers Coalition for carbon dioxide removal.\\n\\n8. **Partnerships and Coalitions**:\\n   - Google collaborates with various organizations, including the World Business Council for Sustainable Development (WBCSD) and the World Resources Institute (WRI), to promote sustainability and address climate change.\\n\\n9. **Empowering Individuals and Communities**:\\n   - Google aims to help 1 billion people make more sustainable choices through their products by 2030. This includes features like energy-efficient Google Nest thermostats and carbon emissions information in Google Flights.\\n\\nOverall, Google's environmental initiatives are extensive and integrated into their business operations, product development, and community engagement, reflecting their commitment to sustainability and climate action.\""
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "final_answer['messages'][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "58da5c40-fdbc-458f-800f-4089d01b4030",
   "metadata": {},
   "source": [
    "*Formatted:*\n",
    "\n",
    "Google has a comprehensive and multifaceted approach to environmental sustainability, encompassing various initiatives aimed at reducing carbon emissions, promoting sustainable practices, and leveraging technology for environmental benefits. Here are some key aspects of Google's environmental initiatives:\n",
    "\n",
    "1. **Carbon Reduction and Renewable Energy**:  \n",
    "- **iMasons Climate Accord**: Google is a founding member and part of the governing body of this coalition focused on reducing carbon emissions in digital infrastructure.\n",
    "- **Net-Zero Carbon**: Google is committed to operating sustainably with a focus on achieving net-zero carbon emissions. This includes investments in carbon-free energy and energy-efficient facilities, such as their all-electric, net water-positive Bay View campus.\n",
    "\n",
    "2. **Sustainable Consumption and Circular Economy**:\n",
    "- **Right to Repair**: Google has engaged with the European Commission to promote the repair and reuse of goods, particularly smartphones and tablets.\n",
    "- **Circular Economy**: Google works with suppliers to ensure environmental criteria are met, including the management of hazardous substances and resource efficiency. They also promote recycling and the use of refurbished products.\n",
    "\n",
    "3. **Water Stewardship**:\n",
    "- Google supports watershed projects and responsible water use, including initiatives in Chile and the United States. Their Bay View campus incorporates stormwater retention and other water-positive features.\n",
    "\n",
    "4. **Food Waste Reduction**:\n",
    "- **ReFED**: Google provided anchor funding to the ReFED Catalytic Grant Fund to accelerate and scale food waste solutions.\n",
    "\n",
    "5. **Reforestation and Biodiversity**:\n",
    "- **The Nature Conservancy (TNC)**: Google supports reforestation projects and the development of technology to stop deforestation in the Amazon. They also work on kelp reforestation and other biodiversity initiatives.\n",
    "\n",
    "6. **Technology and Data for Environmental Action**:\n",
    "- **Google Earth Engine**: Provides access to data for monitoring environmental changes.\n",
    "- **Environmental Insights Explorer**: Helps cities and organizations measure and reduce their carbon footprint.\n",
    "- **Google Maps Eco-Friendly Routing**: Offers routes that reduce carbon emissions, helping users make more sustainable travel choices.\n",
    "\n",
    "7. **Public Policy and Advocacy**:\n",
    "- Google engages in public policy advocacy to support clean energy and climate action, including comments on the U.S. Department of Energy's Clean Hydrogen Production Standard and participation in the First Movers Coalition for carbon dioxide removal.\n",
    "\n",
    "8. **Partnerships and Coalitions**:\n",
    "- Google collaborates with various organizations, including the World Business Council for Sustainable Development (WBCSD) and the World Resources Institute (WRI), to promote sustainability and address climate change.\n",
    "\n",
    "9. **Empowering Individuals and Communities**:\n",
    "- Google aims to help 1 billion people make more sustainable choices through their products by 2030. This includes features like energy-efficient Google Nest thermostats and carbon emissions information in Google Flights.\n",
    "\n",
    "Overall, Google's environmental initiatives are extensive and integrated into their business operations, product development, and community engagement, reflecting their commitment to sustainability and climate action."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a7419cb3-32ed-4f19-8a2a-e27155f9a628",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "name": "CHAPTER8-2_HYBRID-ENSEMBLE.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
